package com.dc.designPattern._11_proxy.extend.extend3;

import java.lang.reflect.Proxy;

/**
 * Description: 具体业务的动态代理
 *
 * 可以简化高层模块的实现，但是会导致类数量的增加
 * 其将高层模块的实现逻辑，放到具体代理类中
 *
 * @author: gdc
 * @date: 2021/6/25
 * @version 1.0
 */
public class SubjectDynamicProxy extends DynamicProxy {

    public static <T> T newProxyInstance(Subject subject) {

        // 寻找JoinPoint切点，符合条件，执行前置通知
        if (true) {
            new BeforeAdvice().exec();
        }

        ClassLoader classLoader = subject.getClass().getClassLoader();
        Class<?>[] interfaces = subject.getClass().getInterfaces();
        MyInvocationHandler handler = new MyInvocationHandler(subject);

        // 执行目标，并返回结果
        return (T) Proxy.newProxyInstance(classLoader, interfaces, handler);
    }

}
